<?php
require_once 'EspacoCultural.php';
require_once 'BancoDeDados.php';
class FonteRecursos {

    private $cod_fonte_recursos;
    private $descricao;
    private $valor;
    private $espaco;
    private $vinculado;

    public function &getCod_fonte_recursos() {
        return $this->cod_fonte_recursos;
    }

    public function setCod_fonte_recursos(&$cod_fonte_recursos) {
        $this->cod_fonte_recursos = &$cod_fonte_recursos;
    }

    public function &getDescricao() {
        return $this->descricao;
    }

    public function setDescricao(&$descricao) {
        $this->descricao = &$descricao;
    }

    public function &getValor() {
        return $this->valor;
    }

    public function setValor(&$valor) {
        $this->valor = &$valor;
    }

    /**
     *
     * @return EspacoCultural
     */
    public function &getEspaco() {
        return $this->espaco;
    }

    public function setEspaco(&$espaco) {
        $this->espaco = &$espaco;
    }

    public function &isVinculado() {
        return $this->vinculado;
    }

    public function setVinculado(&$vinculado) {
        $this->vinculado = &$vinculado;
    }

    public function cadastrar() {
        if ($this->validar() != 1) {
            throw new Exception("Fonte de Recursos existente");
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into fonte_recursos (descricao) values(?)');
        $result = $link->execute($stmt, array($this->descricao));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
    }

    public function cadastrarValor() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into espaco_fonte_recursos (cod_espaco, cod_fonte_recursos, valor) values(?,?,?)');
        $result = $link->execute($stmt, array($this->espaco->getCod_espaco(), $this->cod_fonte_recursos, $this->valor));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
    }

    public function alterarCampo(&$campo_id, &$campo_valor) {
        if ($campo_id == 'descricao' && $this->descricao != $campo_valor) {
            $temp = &$this->descricao;
            $this->descricao = &$campo_valor;
            if ($this->validar() != 1) {
                throw new Exception("Recurso existente |".$temp);
            }
        } else {
            throw new Exception('no_action');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update fonte_recursos set ' . $campo_id . ' = ? where cod_fonte_recursos = ?');
        $result = $link->execute($stmt, array($campo_valor, $this->cod_fonte_recursos));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}"." |".$temp);
        }
        $link->commit();
    }

    public function alterarValor() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update espaco_fonte_recursos set valor = ? where cod_fonte_recursos = ? and cod_espaco = ?');
        $result = $link->execute($stmt, array($this->valor, $this->cod_fonte_recursos, $this->espaco->getCod_espaco()));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
    }

    public function excluir() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from fonte_recursos where cod_fonte_recursos = ?');
        $result = $link->execute($stmt, array($this->cod_fonte_recursos));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
    }

    public function excluirValor() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from espaco_fonte_recursos where cod_fonte_recursos = ? and cod_espaco = ?');
        $result = $link->execute($stmt, array($this->cod_fonte_recursos, $this->espaco->getCod_espaco()));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
    }

    public static function &listar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from fonte_recursos order by descricao');
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $fonte_recursos = new FonteRecursos();
            $fonte_recursos->setCod_fonte_recursos($row['cod_fonte_recursos']);
            $fonte_recursos->setDescricao($row['descricao']);
            $fonte_recursos->setVinculado($fonte_recursos->verificarVinculacao());
            $resultado[] = &$fonte_recursos;
            unset($fonte_recursos);
        }
        return $resultado;
    }
    
    /**
     *
     * @param integer $cod_fonte_recursos
     * @return FonteRecursos 
     */
    public static function &consultar($cod_fonte_recursos) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from fonte_recursos where cod_fonte_recursos = ?', array($cod_fonte_recursos));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() == 0) {
            throw new Exception("Fonte de recursos inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de uma fonte de recursos com o mesmo identificador, informe ao administrador");
        }
        $result->fetchInto($row);
        $fonte_recursos = new FonteRecursos();
        $fonte_recursos->setCod_fonte_recursos($row['cod_fonte_recursos']);
        $fonte_recursos->setDescricao($row['descricao']);
        $fonte_recursos->setVinculado($fonte_recursos->verificarVinculacao());
        return $fonte_recursos;
    }
    
    /**
     *
     * @param string $descricao
     * @return FonteRecursos 
     */
    public static function &consultarPorDescricao($descricao) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from fonte_recursos where descricao = ?', array($descricao));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() == 0) {
            throw new Exception("Fonte de recursos inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de uma fonte de recursos com o mesmo identificador, informe ao administrador");
        }
        $result->fetchInto($row);
        $fonte_recursos = new FonteRecursos();
        $fonte_recursos->setCod_fonte_recursos($row['cod_fonte_recursos']);
        $fonte_recursos->setDescricao($row['descricao']);
        $fonte_recursos->setVinculado($fonte_recursos->verificarVinculacao());
        return $fonte_recursos;
    }

    public static function &listarPorEspaco(EspacoCultural $espaco) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select f.cod_fonte_recursos, f.descricao from fonte_recursos f, espaco_fonte_recursos e where f.cod_fonte_recursos = e.cod_fonte_recursos and e.cod_espaco = ? order by descricao', array($espaco->getCod_espaco()));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $fonte_recursos = new FonteRecursos();
            $fonte_recursos->setCod_fonte_recursos($row['cod_fonte_recursos']);
            $fonte_recursos->setDescricao($row['descricao']);
            $fonte_recursos->setValor($row['valor']);
            $fonte_recursos->setEspaco($espaco);
            $resultado[$row['cod_fonte_recursos']] = &$fonte_recursos;
            unset($fonte_recursos);
        }
        return $resultado;
    }

    private function &validar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_fonte_recursos from fonte_recursos where descricao = ?', array($this->descricao));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $resultado = 1;
        if ($result->numRows() > 0) {
            $resultado = 0;
        }
        return $resultado;
    }

    private function &verificarVinculacao() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_fonte_recursos from espaco_fonte_recursos where cod_fonte_recursos = ?', array($this->cod_fonte_recursos));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $resultado = 0;
        if ($result->numRows() > 0) {
            $resultado = 1;
        }
        return $resultado;
    }

}
?>